﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleIR
{

	////////////////////////////////////
	//Types

	/// <summary>
	/// Tags for marking special fields that we use frequently in the analysis components.
	/// </summary>
	public enum SpecialTypeTag { NormalTypeTag, VoidTag, RootObjTag, StringTag };

	/// <summary>
	/// Tags for marking properties of types, both that currently exist in C# and that we add as attributes.
	/// </summary>
	[Flags]
	public enum TypeQualifiers
	{
		Clear             = 0x0,
		StaticTag         = 0x1,
		InterfaceTag      = 0x2,
		AbstractTag       = 0x4,
		PublicTag         = 0x8,
		InternalTag       = 0x10,
		BuiltinTag        = 0x20,
		SpcializedImplTag = 0x40
	};

	////////////////////////////////////
	//Fields

	/// <summary>
	/// Tags for marking special fields that we use frequently in the analysis components.
	/// </summary>
	public enum SpecialFieldTag 
	{ 
		NormalField, 
		SummaryLocationField, 
		ContainerCardField, 
		EnumeratorCollectionField 
	};

	/// <summary>
	/// Tags for marking properties of fields, both that currently exist in C# and that we add as attributes.
	/// </summary>
	[Flags]
	public enum FieldQualifiers : ulong
	{
		PublicTag = 0x1,
		InternalTag = 0x2,
		PrivateTag = 0x4
	};

	////////////////////////////////////
	//Methods
	
	/// <summary>
	/// Tags for marking properties of types, both that currently exist in C# and that we add as attributes.
	/// </summary>
	[Flags]
	public enum MethodQualifiers : ulong
	{
		Clear = 0x0,
		AbstractTag = 0x1,
		PublicTag = 0x2,
		InternalTag = 0x4,
		PrivateTag = 0x8,
		BuiltinTag = 0x10,
		TypePatchNeeded = 0x20,
		EnumeratorGetterSimpleContainer = 0x40,
		EnumeratorGetterDictionary = 0x80,
		EnumeratorGetterDictionaryKeys = 0x100,
		EnumeratorGetterSimpleDictionaryValues = 0x200,
		AdvanceEnumerator = 0x400,
		GetIndexer = 0x800,
		DoNotClearTraverse = 0x1000
	};
}
